#include "Dothway_Link_List.h"

// 初始化链表
Head_Node *Init_Link_List()
{
    Head_Node *Head = NULL;

    // 创建动态空间
    Head = (Head_Node *)malloc(sizeof(Head_Node));

    // 安全判断
    if (Head == NULL)
    {
        printf("链表创建失败!\n");
        return NULL;
    }

    Head->next = NULL;

    return Head;
}

// 销毁链表
void Free_Link_List(Head_Node **Head)
{
    // 安全判断
    if (*Head == NULL)
    {
        printf("链表为NULL\n");
        return;
    }
    if ((*Head)->next == NULL)
    {
        printf("链表为空\n");
        (*Head)->next = NULL;
        free(*Head);
        return;
    }

    Node *ptr_1 = (*Head)->next;
    Node *ptr_2 = ptr_1->next;

    // 销毁节点
    for (size_t i = 0; ptr_1 != NULL; i++)
    {
        free(ptr_1);
        ptr_1 = ptr_2;
        if (ptr_2 != NULL) // 当ptr_2为 NULL 时 ptr_2不往下跳了 在跳会越界
        {
            ptr_2 = ptr_2->next;
        }
    }

    // 销毁头节点
    (*Head)->next = NULL;
    free(*Head);
}

// 插入
void Insert_Link_List(Head_Node *Head, Element_data data, int pos)
{
    //安全判断
    if (Head == NULL)
    {
        ERRLOG("链表为NULL");
    }

    //创建下一个节点的地址
    Node * New_Node = (Node*)malloc(sizeof(Node));

    //为下一个节点添加数据
    New_Node->data = data;
    New_Node->next = NULL;
    New_Node->prev = NULL;

    //头插
    if (pos == 1)
    {
        Head->next = New_Node;
        return;
    }
    
    //任意插
    Node * ptr = Head->next;
    for (size_t i = 1; i < pos - 1 && ptr != NULL; i++) //遍历到 pos 前一个节点
    {
        ptr = ptr->next;
    }
    New_Node->next = ptr->next;
    if (ptr->next != NULL) // 当ptr->next == NULL 时为尾插
    {
        ptr->next->prev = New_Node;
    }
    ptr->next = New_Node;
    New_Node->prev = ptr;
    
    
}

//删除
Element_data Del_Link_List(Head_Node * Head , int pos)
{
    Element_data delete_data;
    if (NULL == Head)
    {
        ERRLOG("链表的动态空间为空");
        return delete_data;
    }
    if (NULL == Head->next)
    {
        ERRLOG("链表内无数据");
        return delete_data;
    }
    // 头删
    if (1 == pos)
    {
        Node * ptr = Head->next;
        // 1、将头节点 指向 ptr 的next
        Head->next = ptr->next;
        // 2、将 ptr 的 next 的 prev 指向 NULL
        ptr->next->prev = NULL;

        // 将要删除的数据保存 返回
        delete_data = ptr->data;

        // 3、释放ptr空间
        free(ptr);

        return delete_data;
    }

    // 任意位置删除
    Node * ptr_1 = Head->next;
    Node * ptr_2 = ptr_1->next;

    for (size_t i = 1; i < pos - 1 && NULL != ptr_1->next; i++)
    {
        ptr_1 = ptr_1->next;
        ptr_2 = ptr_1->next;
    }
    
    if (NULL == ptr_1->next)
    {
        ERRLOG("删除访问越界\n");
        return delete_data;
    }
    
    // 删除

    // 1、 ptr_1 的next 指向 ptr_2 的next
    ptr_1->next = ptr_2->next;
    // 2、 pre_2 的 next 的 prev 指向 ptr_1
    if (NULL != ptr_2->next)
    {
        ptr_2->next->prev = ptr_1;
    }

    // 将数据写入到 要返回的变量中
    delete_data = ptr_2->data;

    // 3、释放
    free(ptr_2);

    return delete_data;
}

//遍历
void Printf_Link_List(Head_Node * Head)
{
    // 安全判断
    if (Head == NULL)
    {
        printf("链表为NULL\n");
        return;
    }
    if (Head->next == NULL)
    {
        printf("啥也没有,遍历个集贸\n");
        return;
    }

    Node *ptr = Head->next;
    for (size_t i = 0; ptr != NULL; i++)
    {
        printf("账户:%s 密码:%s 账号权限%c:\n", ptr->data.user, ptr->data.pas, ptr->data.id);
        ptr = ptr->next;
    }
}

//名字查找 返回该名字所在节点的地址
Node * Find_By_Name(Head_Node * Head , char * name)
{
    // 安全判断
    if (Head == NULL)
    {
        printf("链表为NULL\n");
        return NULL;
    }
    if (Head->next == NULL)
    {
        printf("啥也没有,找个集贸\n");
        return NULL;
    }

    Node *ptr = Head->next;
    for (size_t i = 0; ptr != NULL; i++)
    {
        if (!strcmp(ptr->data.user, name))
        {
            return ptr;
        }
        ptr = ptr->next;
    }
    printf("该账号信息不存在\n");
}

//清空
void Empty_Link_List(Head_Node * Head)
{
    // 安全判断
    if (Head == NULL)
    {
        printf("链表为NULL\n");
        return;
    }
    if (Head->next == NULL)
    {
        printf("链表为空\n");
        Head->next = NULL;
        free(Head);
        return;
    }

    Node *ptr_1 = Head->next;
    Node *ptr_2 = ptr_1->next;

    // 销毁节点
    for (size_t i = 0; ptr_1 != NULL; i++)
    {
        free(ptr_1);
        ptr_1 = ptr_2;
        if (ptr_2 != NULL) // 当ptr_2为 NULL 时 ptr_2不往下跳了 在跳会越界
        {
            ptr_2 = ptr_2->next;
        }
    }

}